paddleboard_ai_dock: Surface MCP catalog and add modal expand toggle - #39
Merged
Conversation
Fixes the gap called out in PR #38's known follow-ups: the dock header counted "5 MCP servers" but the MCP tab itself only embedded McpServersView (installed-only) and never rendered the 5 catalog entries. First-run users would click MCP, see "No MCP servers installed yet", and have no way to discover what was available without going elsewhere. What lands: - Compact "Available" section rendered at the top of the MCP tab, above the absorbed McpServersView. One row per catalog entry, with icon, name, description (truncated to the row width), and an Install / Installed button. - Install button writes a ContextServerSettingsContent::Stdio entry into settings.project.context_servers keyed by the catalog id, using the catalog entry's command + args. update_settings_file does the write; the absorbed McpServersView picks up the new server through its existing context_server_store subscription. cx.notify() also fires after the write so the catalog row flips to "Installed" without waiting for the settings cascade. - Install state is read each render from ProjectSettings::get_global(cx).context_servers.keys(); any matching catalog id shows the disabled "Installed" badge regardless of which variant (Stdio, SandboxedStdio, Extension, Http) the user actually has, so a server added via a different path doesn't get double-listed. Intentionally preserved: - crates/agent_ui/src/mcp_servers_ui.rs is untouched. The catalog section sits above the absorbed view in a v_flex().size_full() with the view as flex_1().min_h_0() below — every keymap binding, search filter, "+ Add Server" popover, status indicator, etc. that ships with the absorbed view continues to work without divergence. - Default install variant is Stdio (unsandboxed) rather than SandboxedStdio, because SandboxedStdio requires a container image field and the catalog doesn't currently specify one. Users can flip to sandboxed after install. Extending McpEntry with an optional image field to enable SandboxedStdio-by-default is a worthwhile followup (aligns with PB's sandboxing emphasis) but out of scope. Verified: - cargo check -p paddleboard_ai_dock clean - ./script/clippy -p paddleboard_ai_dock (release, all targets, deny warnings) clean - UI smoke test: clicked Install on the Filesystem catalog entry from the running app. The catalog row flipped to "Installed", the MCP Servers header re-rendered to "1/1 running", a new filesystem card appeared in the absorbed view with Running status, the server process actually spawned (npx -y @modelcontextprotocol/server-filesystem .), and ~/.config/paddleboard/settings.json gained the exact Stdio block the catalog described. Release Notes: - Added an "Available" catalog section to the AI Dock's MCP Servers tab. The 5 bundled MCP server entries (filesystem, fetch, git, github, puppeteer) are now visible above the installed-servers manager, each with a one-click Install button that writes the right settings entry and spawns the server. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds a maximize/minimize toggle in the modal header so users can grow the dock when there's more catalog or install content to scan than the default size comfortably fits. What lands: - New `expanded: bool` field on `AiDock`, default `false`, plus a `toggle_expanded` method that flips it and calls `cx.notify()`. - New `IconButton` in `render_header` placed left of the close button. Icon swaps between `IconName::Maximize` (when collapsed) and `IconName::Minimize` (when expanded); tooltip swaps between "Expand" and "Collapse". Both buttons live in the same `h_flex().gap_1()` cluster so the header layout doesn't shift across toggles. - `render()` picks size based on `self.expanded` — normal is `56rem x 36rem` (unchanged), expanded is `80rem x 54rem` (~2.1x the area). Each tab's render path is size-agnostic — rows are full-width and the embedded `McpServersView` has its own internal scroll — so growing the modal just gives the content more room. Intentionally preserved: - State is per-modal-instance, not persisted. Closing and reopening the dock starts collapsed. Persisting modal layout across reopens is the kind of small-but-controversial UX call worth deferring until someone explicitly wants it. - Two-state preset rather than free drag-to-resize. GPUI doesn't have a built-in resizable-modal primitive and rolling one would be a much bigger lift than the "minor change" framing implied. Also: removes the stray `paddleboard-5.png` sketch image that got committed at the repo root in the initial AI Dock commit (3d22299). Was already called out as a known follow-up in PR #38; closing it here. Verified: - cargo check -p paddleboard_ai_dock clean - ./script/clippy -p paddleboard_ai_dock (release, all targets, deny warnings) clean - UI verification: clicked the new Maximize button in the modal header, the modal grew to the expanded size, the icon swapped to Minimize and tooltip flipped to "Collapse". Close button stayed in place. Release Notes: - Added an Expand / Collapse toggle to the AI Dock modal header so users can grow the dock to roughly 2x the area when browsing longer catalog or install lists. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Upstream drift reportComparing PaddleBoard
Generated by |
jasonsmithio
added a commit
that referenced
this pull request
May 31, 2026
paddleboard_ai_dock: Surface MCP catalog and add modal expand toggle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two AI Dock followups that were committed and verified in the same session as PR #38, but landed on the branch after PR #38 was merged. Same crate (
paddleboard_ai_dock), same scope, same test surface.7b7327b664— Surface MCP catalog in the MCP tab. Fixes the gap called out as a known follow-up in PR paddleboard_ai_dock: Introduce the AI Dock #38: the dock header counted "5 MCP servers" but the MCP tab itself only embeddedMcpServersView(installed-only) and never rendered the 5 catalog entries. Now an Available section sits above the absorbed view with one row per catalog entry (Filesystem, Fetch, Git, GitHub, Puppeteer). The Install button writes aContextServerSettingsContent::Stdioentry intocontext_serverskeyed by the catalog id; the absorbedMcpServersViewpicks up the new server through its existingcontext_server_storesubscription. Install state is read each render from settings, so any matching id shows as "Installed" regardless of which variant it was added through.crates/agent_ui/src/mcp_servers_ui.rsis untouched — fork-hygiene preserved.8b94177cbd— Make the AI Dock modal expandable. Newexpanded: boolfield onAiDockplus a Maximize / Minimize icon button in the header (left of the X). Toggles between56rem × 36rem(default, unchanged) and80rem × 54rem(~2.1× the area). State is per-modal-instance, not persisted. Each tab's render path is size-agnostic — rows are full-width and the embeddedMcpServersViewhas its own scroll — so growing the modal just gives the content more room. Also drops the straypaddleboard-5.pngsketch image that was committed at the repo root in3d22299897(called out as a known follow-up in PR paddleboard_ai_dock: Introduce the AI Dock #38).Test plan
cargo check -p paddleboard_ai_dockclean./script/clippy -p paddleboard_ai_dock(release, all targets, deny warnings) cleanMcpServersViewre-rendered to "1/1 running", newfilesystemcard appeared with Running status, thenpx -y @modelcontextprotocol/server-filesystem .process actually spawned, and~/.config/paddleboard/settings.jsongained the exact Stdio block the catalog described.56rem × 36remto80rem × 54rem, icon swapped to Minimize, tooltip swapped to "Collapse". Header layout stable across toggles. Click again collapses back.Known follow-ups (carried over)
/verify,/review,/security-revieware still in the catalog without bundled content; render as "Not installed" with no install path. Decide whether to drop from catalog (harness owns discovery) or ship our own copies.McpEntryshould grow an optionalimagefield so the catalog can describe SandboxedStdio-capable servers (e.g.ghcr.io/github/github-mcp-server:latestforgithub). Then the install default could flip to sandboxed for entries that have an image, aligning with PB's sandboxing emphasis.workspace.rs:785/paddleboard/src/main.rs:1494only writePaddleBoard_Tour.mdwhen missing. Existing users won't see updated tour content without manual delete.Release Notes: